import dynamic from 'next/dynamic'
import NextImage from 'next/image';
import { useEffect, useState } from 'react'
import { useRouter } from 'next/router'
import Seo from '../../../core/components/Seo.jsx'
import Promocrumb from '../../../lib/promo/components/Promocrumb.jsx'
import { fetchPromoItemsSolr, fetchVariantSolr } from '../../../api/promoApi.js'
import LogoSpinner from '../../../core/components/elements/Spinner/LogoSpinner.jsx'
import ProductPromoCard from '../../../../src-migrate/modules/product-promo/components/Card.tsx'
import { IPromotion } from '../../../../src-migrate/types/promotion.ts'
import React from 'react'
import { SolrResponse } from "../../../../src-migrate/types/solr.ts";
import DesktopView from '../../../core/components/views/DesktopView.jsx';
import MobileView from '../../../core/components/views/MobileView.jsx';
import 'swiper/swiper-bundle.css';
import useDevice from '../../../core/hooks/useDevice.js'
import ProductFilterDesktop from '../../../lib/product/components/ProductFilterDesktopPromotion.jsx';
import ProductFilter from '../../../lib/product/components/ProductFilter.jsx';
import { HStack, Image, Tag, TagCloseButton, TagLabel } from '@chakra-ui/react';
import { formatCurrency } from '../../../core/utils/formatValue.js';
import Pagination from '../../../core/components/elements/Pagination/Pagination.js';
import SideBanner from '../../../../src-migrate/modules/side-banner/index.tsx';
import whatsappUrl from '../../../core/utils/whatsappUrl.js';
import { cons, toQuery } from 'lodash-contrib';
import _ from 'lodash';
import useActive from '../../../core/hooks/useActive.js';
import useProductSearch from '../../../lib/promo/hooks/usePromotionSearch.js';
const BasicLayout = dynamic(() => import('../../../core/components/layouts/BasicLayout.jsx'))
export default function PromoDetail() {
const router = useRouter()
const { slug = '', brand ='', category='', priceFrom = '', priceTo = '', page = '1' } = router.query
const [promoItems, setPromoItems] = useState([])
const [promoData, setPromoData] = useState(null)
const [currentPage, setCurrentPage] = useState(parseInt(10) || 1);
const itemsPerPage = 12; // Jumlah item yang ingin ditampilkan per halaman
const [loading, setLoading] = useState(true);
const { isMobile, isDesktop } = useDevice()
// const [brands, setBrands] = useState([]);
// const [categories, setCategories] = useState([]);
const [brandValues, setBrandValues] = useState([]);
const [categoryValues, setCategoryValues] = useState([]);
const [orderBy, setOrderBy] = useState(router.query?.orderBy);
const popup = useActive();
const prefixUrl = `/shop/promo/${slug}`
const [queryFinal, setQueryFinal] = useState({});
const [limit, setLimit] = useState(22);
const [q, setQ] = useState('*');
const [finalQuery, setFinalQuery] = useState({fq: `type_value_s:${slug}`});
const [products, setProducts] = useState(null);
useEffect(() => {
setQueryFinal({ ...finalQuery, q, limit, orderBy });
}, [router.query, prefixUrl, slug, brand, category, priceFrom, priceTo, currentPage]);
useEffect(() => {
setQueryFinal({ ...finalQuery, q, limit, orderBy });
}, [router.query, prefixUrl, slug, brand, category, priceFrom, priceTo, currentPage]);
const { productSearch } = useProductSearch({
query: queryFinal,
operation: 'OR',
});
console.log("productSearch",productSearch)
console.log("queryFinal",queryFinal)
const pageCount = Math.ceil(productSearch.data?.response.numFound / limit);
const productStart = productSearch.data?.responseHeader.params.start;
const productRows = limit;
const productFound = productSearch.data?.response.numFound;
useEffect(() => {
setProducts(productSearch.data?.response?.products);
}, [productSearch]);
console.log("products",products)
const brands = [];
for (
let i = 0;
i < productSearch.data?.facet_counts?.facet_fields?.manufacture_name_s.length;
i += 2
) {
const brand =
productSearch.data?.facet_counts?.facet_fields?.manufacture_name_s[i];
const qty =
productSearch.data?.facet_counts?.facet_fields?.manufacture_name_s[i + 1];
if (qty > 0) {
brands.push({ brand, qty });
}
}
console.log("brands",brands)
const categories = [];
for (
let i = 0;
i < productSearch.data?.facet_counts?.facet_fields?.category_name.length;
i += 2
) {
const name = productSearch.data?.facet_counts?.facet_fields?.category_name[i];
const qty =
productSearch.data?.facet_counts?.facet_fields?.category_name[i + 1];
if (qty > 0) {
categories.push({ name, qty });
}
}
useEffect(() => {
if (router.query.brand) {
let brandsArray= [];
if (Array.isArray(router.query.brand)) {
brandsArray = router.query.brand;
} else if (typeof router.query.brand === 'string') {
brandsArray = router.query.brand.split(',').map((brand) => brand.trim());
}
setBrandValues(brandsArray);
} else {
setBrandValues([]);
}
if (router.query.category) {
let categoriesArray= [];
if (Array.isArray(router.query.category)) {
categoriesArray = router.query.category;
} else if (typeof router.query.category === 'string') {
categoriesArray = router.query.category.split(',').map((category) => category.trim());
}
setCategoryValues(categoriesArray);
} else {
setCategoryValues([]);
}
}, [router.query.brand, router.query.category]);
useEffect(() => {
const loadPromo = async () => {
setLoading(true);
const brandsData = [];
const categoriesData= [];
const pageNumber = Array.isArray(page) ? parseInt(page[0], 10) : parseInt(page, 10);
setCurrentPage(pageNumber)
try {
const items = await fetchPromoItemsSolr(`type_value_s:${Array.isArray(slug) ? slug[0] : slug}`,0,10);
setPromoItems(items);
if (items.length === 0) {
setPromoData([])
setLoading(false);
return;
}
const brandArray = Array.isArray(brand) ? brand : brand.split(',');
const categoryArray = Array.isArray(category) ? category : category.split(',');
const promoDataPromises = items.map(async (item) => {
try {
let brandQuery = '';
if (brand) {
brandQuery = brandArray.map(b => `manufacture_name_s:${b}`).join(' OR ');
brandQuery = `(${brandQuery})`;
}
let categoryQuery = '';
if (category) {
categoryQuery = categoryArray.map(c => `category_name:${c}`).join(' OR ');
categoryQuery = `(${categoryQuery})`;
}
let priceQuery = '';
if (priceFrom && priceTo) {
priceQuery = `price_f:[${priceFrom} TO ${priceTo}]`;
} else if (priceFrom) {
priceQuery = `price_f:[${priceFrom} TO *]`;
} else if (priceTo) {
priceQuery = `price_f:[* TO ${priceTo}]`;
}
let combinedQuery = '';
let combinedQueryPrice = `${priceQuery}`;
if (brand && category && priceFrom || priceTo) {
combinedQuery = `${brandQuery} AND ${categoryQuery} `;
} else if (brand && category) {
combinedQuery = `${brandQuery} AND ${categoryQuery}`;
} else if (brand && priceFrom || priceTo) {
combinedQuery = `${brandQuery}`;
} else if (category && priceFrom || priceTo) {
combinedQuery = `${categoryQuery}`;
} else if (brand) {
combinedQuery = brandQuery;
} else if (category) {
combinedQuery = categoryQuery;
}
if (combinedQuery && priceFrom || priceTo) {
const response = await fetchVariantSolr(`id:${item.product_id} AND ${combinedQuery}`);
const product = response.response.docs[0];
const product_id = product.id;
const response2 = await fetchPromoItemsSolr(`type_value_s:${Array.isArray(slug) ? slug[0] : slug} AND product_ids:${product_id} AND ${combinedQueryPrice}`,0,100);
return response2;
}else if(combinedQuery){
const response = await fetchVariantSolr(`id:${item.product_id} AND ${combinedQuery}`);
const product = response.response.docs[0];
const product_id = product.id;
const response2 = await fetchPromoItemsSolr(`type_value_s:${Array.isArray(slug) ? slug[0] : slug} AND product_ids:${product_id} `,0,100);
return response2;
} else {
const response = await fetchPromoItemsSolr(`id:${item.id}`,0,100);
return response;
}
} catch (fetchError) {
return [];
}
});
const promoDataArray = await Promise.all(promoDataPromises);
const mergedPromoData = promoDataArray.reduce((accumulator, currentValue) => accumulator.concat(currentValue), []);
setPromoData(mergedPromoData);
const dataBrandCategoryPromises = promoDataArray.map(async (promoData) => {
if (promoData) {
const dataBrandCategory = promoData.map(async (item) => {
let response;
if(category){
const categoryQuery = categoryArray.map(c => `category_name:${c}`).join(' OR ');
response = await fetchVariantSolr(`id:${item.products[0].product_id} AND (${categoryQuery})`);
}else{
response = await fetchVariantSolr(`id:${item.products[0].product_id}`)
}
if (response.response?.docs?.length > 0) {
const product = response.response.docs[0];
const manufactureNameS = product.manufacture_name;
if (Array.isArray(manufactureNameS)) {
for (let i = 0; i < manufactureNameS.length; i += 2) {
const brand = manufactureNameS[i];
const qty = 1;
const existingBrandIndex = brandsData.findIndex(b => b.brand === brand);
if (existingBrandIndex !== -1) {
brandsData[existingBrandIndex].qty += qty;
} else {
brandsData.push({ brand, qty });
}
}
}
const categoryNameS = product.category_name;
if (Array.isArray(categoryNameS)) {
for (let i = 0; i < categoryNameS.length; i += 2) {
const name = categoryNameS[i];
const qty = 1;
const existingCategoryIndex = categoriesData.findIndex(c => c.name === name);
if (existingCategoryIndex !== -1) {
categoriesData[existingCategoryIndex].qty += qty;
} else {
categoriesData.push({ name, qty });
}
}
}
}
});
return Promise.all(dataBrandCategory);
}
});
await Promise.all(dataBrandCategoryPromises);
setBrands(brandsData);
setCategories(categoriesData);
setLoading(false);
} catch (loadError) {
// console.error("Error loading promo items:", loadError)
setLoading(false);
}
}
if (slug) {
loadPromo()
}
},[slug, brand, category, priceFrom, priceTo, currentPage]);
function capitalizeFirstLetter(string) {
string = string.replace(/_/g, ' ');
return string.replace(/(^\w|\s\w)/g, function(match) {
return match.toUpperCase();
});
}
const handleDeleteFilter = async (source, value) => {
let params = {
q: router.query.q,
orderBy: '',
brand: brandValues.join(','),
category: categoryValues.join(','),
priceFrom: priceFrom || '',
priceTo: priceTo || '',
};
let brands = brandValues;
let catagories = categoryValues;
switch (source) {
case 'brands':
brands = brandValues.filter((item) => item !== value);
params.brand = brands.join(',');
await setBrandValues(brands);
break;
case 'category':
catagories = categoryValues.filter((item) => item !== value);
params.category = catagories.join(',');
await setCategoryValues(catagories);
break;
case 'price':
params.priceFrom = '';
params.priceTo = '';
break;
case 'delete':
params = {
q: router.query.q,
orderBy: '',
brand: '',
category: '',
priceFrom: '',
priceTo: '',
};
break;
}
handleSubmitFilter(params);
};
const handleSubmitFilter = (params) => {
params = _.pickBy(params, _.identity);
params = toQuery(params);
router.push(`${slug}?${params}`);
};
const visiblePromotions = promoData?.slice( (currentPage-1) * itemsPerPage, currentPage * 12)
const toQuery = (obj) => {
const str = Object.keys(obj)
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}`)
.join('&')
return str
}
const whatPromo = capitalizeFirstLetter(slug)
const queryWithoutSlug = _.omit(router.query, ['slug'])
const queryString = toQuery(queryWithoutSlug)
return (
Belum ada promo pada kategori ini Belum ada promo pada kategori iniPromo {whatPromo}
Promo {whatPromo}